# -*- coding: utf-8 -*-

# 这个文件用来提供接口的简易说明
# 实际实现在 Kernel.py 中

import KBEngine
from KBEDebug import *

def Instance():
	if IKernel.instance == None:
		#在这里 import 是为了解决互相包含的问题
		from Kernel import Kernel
		Kernel().init(False)
	return IKernel.instance

class IKernel:

	instance = None

	def __init__(self):
		assert(IKernel.instance == None)
		IKernel.instance = self

	def init(self, isReload):
		"""
		初始化函数，
		@isReload 是否是重新加载
		"""
		assert(False)
		return False

	def end(self):
		"""
		结束调用
		"""
		assert(False)
		pass;

	def registerFunc(self, funcName, funcAddr):
		"""
		注册回调函数
		@funcName string 回调函数的名字
		@funcAddr callable 回调函数地址 回调参数格式参考 onEvent
		"""
		assert(False)
		return None

	def getFuncAddr(self, funcName):
		"""
		获取函数地址
		@funcName string 回调函数的名字 self.registerFunc 中的第一个参数
		"""
		assert(False)
		return ""

	def sendBaseMsg(self, senderEntityID, receiverEntityID, args):
		"""
		发送 baseapp 消息
		@senderEntityID int 发送者的实体ID
		@receiverEntityID int 接受者实体ID
		@args list 发送的参数列表
		"""
		assert(False)
		return False

	def sendCellMsg(self, senderEntityID, receiverEntityID, args):
		"""
		发送 cellapp 消息
		@senderEntityID int 发送者的实体ID
		@receiverEntityID int 接受者实体ID
		@args list 发送的参数列表
		"""
		assert(False)
		return False

	def sendClientMsg(self, receiverEntityID, args):
		"""
		发送 clientapp 消息
		@senderEntityID int 发送者的实体ID
		@receiverEntityID int 接受者实体ID
		@args list 发送的参数列表
		"""
		assert(False)
		return False

	def sendAllClientsMsgInView(self, entityID, args):
		"""
		这个消息广播给实体View范围内所有的其他绑定了客户端的实体(包括自己的客户端，绑定了客户端的实体通常为玩家)。
		例子：
			avatar的View范围内有玩家A和玩家B以及怪物C。
			avatar.allClients.attack(monsterID，skillID, damage)
			此时，玩家自己和玩家A还有玩家B的客户端都会调用到该实体attack方法，在他们的客户端可以调用指定技能的攻击动作做表现。 
		"""
		assert(False)
		return False

	def sendOtherClientsMsgInView(self, entityID, args):
		"""
		"""
		assert(False)
		return False

	def addIntMsgCallback(self, msgID, funcName, priority=0):
		"""
		添加整型消息回调
		@msgID int 主消息
		@funcName string 注册回调函数(registerFunc)中的回调函数名
		@args list 发送的参数列表
		"""
		assert(False)
		return False

	def onIntMsg(self, senderEntityID, receiverEntityID, args):
		"""
		触发整型消息回调
		@senderEntityID int 发送者的实体ID
		@receiverEntityID int 接受者实体ID
		@args list 发送的参数列表 args[0] 就是主消息号
		"""
		assert(False)
		return False

	def addPropChangedCallback(self, entityID, propName, funcName):
		"""
		添加属性变化回调
		@propName string 属性名
		@funcName 函数名
		"""
		assert(False)
		return False

	def addEventCallback(self, eventType, eventName, funcName, priority=0):
		"""
		添加事件回调
		@eventType type=string 事件类型，通常是用entity名字来区别,也可用基类名监听继承这个类的所有子类的对应事件
		@eventName string 事件的名字
		@funcName string 回调函数名 通过self.registerFunc注册的
		@priority int 优先级 值越小优先级越高
		"""
		assert(False)
		return False

	def onEvent(self, eventType, eventName, senderEntityID, receiverEntityID, args):
		"""
		触发事件
		@eventType type=string 事件类型，通常是用entity名字来区别,可用基类名字监听所有子类的对应事件
		@eventName string 事件的名字
		@senderEntityID int 发送者的entityID
		@receiverEntityID int 接收者的entityID
		@args list 参数列表
		"""
		assert(False)
		return False

	def addHeartbeat(self, entityID, funcName, interval, count):
		"""
		添加心跳(就是定时器)
		@entityID int 实体ID
		@funcName string 注册回调函数(registerFunc)中的回调函数名
		@interval int 两次之间调用的间隔
		@count int 调用的次数(-1 无限制)
		"""
		assert(False)
		return False

	def hasHeartbeat(self, entityID, funcName):
		"""
		添加心跳(就是定时器)
		@entityID int 实体ID
		@funcName string 注册回调函数(registerFunc)中的回调函数名
		"""
		assert(False)
		return False

	def delHeartbeat(self, entityID, funcName):
		"""
		添加心跳(就是定时器)
		@entityID int 实体ID
		@funcName string 注册回调函数(registerFunc)中的回调函数名
		"""
		assert(False)
		return False

	def getDataStringType(self, val):
		"""
		获取val的简单类型(字符串表示)
		"""
		assert(False)
		return ""

	def getSimpleNumType(self, val):
		"""
		获取val的简单类型(数字表示)
		"""
		assert(False)
		return ""

	def isVaildBaseStrType(self, strType):
		"""
		判断字符串是否是有效的基础类型
		"""
		assert(False)
		return False